# -*- coding: UTF-8 -*-
import math
import random
import sys
from tkinter import *

sys.path.append("../Serveur-ControleurClient")

import action

class Entite:
    def __init__(self, nom,dimX, dimY, dimZ, posX, posY, posZ, joueur, vies_max, id):
        self.enDeplacement = False
        self.enRepositionnement = False
        self.offset = 0
        self.nom = nom
        self.nbrVies = vies_max
        self.dimX = dimX
        self.dimY = dimY
        self.dimZ = dimZ
        self.posX = posX
        self.posY = posY
        self.posZ = posZ
        self.joueur = joueur
        self.id = id
        self.vies_max = vies_max
        self.image=None
    def typeEntite(self):
        pass
    def deplacement(self):
        pass
        
    def selection(self, coordDebut, coordFin): #Regarde si on clic sur l'unite
        petitX = coordDebut[0] if coordDebut[0] < coordFin[0] else coordFin[0]
        grandX = coordDebut[0] if coordDebut[0] > coordFin[0] else coordFin[0]
        petitY = coordDebut[1] if coordDebut[1] < coordFin[1] else coordFin[1]
        grandY = coordDebut[1] if coordDebut[1] > coordFin[1] else coordFin[1]
        
        entitePetitX = self.posX - self.dimX / 2
        entiteGrandX = self.posX + self.dimX / 2
        entitePetitY = self.posY - self.dimY / 2
        entiteGrandY = self.posY + self.dimY / 2
        
        if petitX <= entiteGrandX and petitY <= entiteGrandY and grandX >= entitePetitX and grandY >= entitePetitY: 
            return 1
        else:
            return 0
        
class list_ressources:
    def __init__ (self, fer=0, cuivre=0, petrole=0,
                  gaz=0, fertilite=0, roche=0,
                  titane=0, gold=0, argent=0,
                  uranium=0, diamant=0, habitant=0,
                  ):
        self.fer = fer
        self.cuivre = cuivre
        self.petrole = petrole
        self.gaz = gaz
        self.fertilite = fertilite
        self.roche = roche
        self.titane = titane
        self.gold = gold
        self.argent = argent
        self.uranium = uranium
        self.diamant = diamant
        self.habitant = habitant
        
#--------------------------------------------------------------------------#



class Unite(Entite):
    def __init__(self, nom, dimX, dimY, dimZ, posX, posY, posZ, joueur,vies_max, degat, portee, vitesse, vitesse_attaque, id):
        Entite.__init__(self, nom, dimX, dimY, dimZ, posX, posY, posZ, joueur,vies_max, id)
        
        self.targetPosX = -1 #Position X de la target (endroit a se deplacer ou ennemi a attaquer)
        self.targetPosY = -1 #Position Y de la target (endroit a se deplacer ou ennemi a attaquer)
        self.degat = degat
        self.portee = portee
        self.vitesse = vitesse
        self.vitesse_attaque = vitesse_attaque
        self.derniereAttaque = 0
        
    def typeEntite(self):
        return "Unite"
    
    def gethypo(self, x2, y2):
        dx = x2 - self.posX
        dy = y2 - self.posY
        
        if dx != 0 or dy != 0:
            hypo = math.sqrt(pow(dx, 2) + pow(dy, 2))
        else:
            hypo = 0
            
        return hypo

    def deplacement(self, x2, y2, z2=0):                
        nbrpoints = self.gethypo(x2, y2)
        
        dx = x2 - self.posX
        dy = y2 - self.posY
        
        if nbrpoints < self.vitesse: #Pour ne pas que l'unite se deplace plus qu'elle est suppose
            if dx != 0 and dy != 0:
                xp = self.posX + dx
                yp = self.posY + dy
                zp = 0
                                
                return ["deplacement", x2, y2, z2, xp, yp, zp, self.id]
            else:
                self.targetPosX = -1
                self.targetPosY = -1
                self.enRepositionnement = False
                
                return None
        else:
            xp = self.posX + (self.vitesse / nbrpoints) * dx
            yp = self.posY + (self.vitesse / nbrpoints) * dy 
            zp = 0
            
            return ["deplacement", x2, y2, z2, xp, yp, zp, self.id]
    
    def deplacementParUnTic(self, x2, y2, z2):               
        xp = int(self.posX) + 1 if x2 > self.posX else int(self.posX) - 1 if x2 < self.posX else self.posX 
        yp = self.posY + 1 if y2 > self.posY else self.posY - 1 if y2 < self.posY else self.posY
        zp = 0

        prochaineAction = ["deplacement", x2, y2, z2, xp, yp, zp, self.id]
        
        if((x2 != xp) or (y2 != yp)):
            return prochaineAction
        else:
            self.targetPosX = -1
            self.targetPosY = -1
            self.enRepositionnement = False
            return None
        
    def attaquer(self, modele, cible, frameCourant):
        self.targetPosX = cible.posX
        self.targetPosY = cible.posY
              
        #Verifie si la cible est morte...a voir s'il y aura d'autres manieres
        if cible == None or cible.nbrVies <= 0:
            self.enDeplacement = False
            self.targetPosX = -1
            self.targetPosY = -1
            
            return 0
        
        if self.gethypo(cible.posX, cible.posY) > self.portee:
            deplacement = self.deplacement(cible.posX, cible.posY, cible.posZ)
            self.posX = deplacement[4]
            self.posY = deplacement[5]
            self.posZ = deplacement[6]
            
            self.enDeplacement = True
            
            return frameCourant + 1
        elif frameCourant - self.vitesse_attaque < self.derniereAttaque: #Si la derniere attaque a ete faite avant que le cooldown soit termine
            self.enDeplacement = False
            
            return self.derniereAttaque + self.vitesse_attaque
         
        else: #Si la cible est en vie et qu'il n'y a pas de cooldown
            """Comparer la distance entre la cible et l'unite versus sa portee d'attaque
                Si la cible est trop eloignee, l'unite se deplacera vers elle.  
                Verifie aussi si le cooldown est a zero (si l'unite peut tirer)"""
            
            #self.targetPosX = x2
            #self.targetPosY = y2
                        
            cible.nbrVies = cible.nbrVies - self.degat
            self.derniereAttaque = frameCourant
            modele.parent.dessinerAttaque(self, cible)
            
            self.enDeplacement = False
            
            return frameCourant + self.vitesse_attaque
            
    def detecterCollision(self, entite):
        entitePetitX = entite.posX - entite.dimX / 2
        entiteGrandX = entite.posX + entite.dimX / 2
        entitePetitY = entite.posY - entite.dimY / 2
        entiteGrandY = entite.posY + entite.dimY / 2
        
        coordDebut = (entitePetitX, entitePetitY)
        coordFin = (entiteGrandX, entiteGrandY)
        
        return self.selection(coordDebut, coordFin)

if __name__ == '__main__':

    vaisseau = Unite(Entite, 2, 2,
                 2, "Croisier", "vaisseau",
                 100, 10, 10, 0,
                 8, 11, 7, "xyz",
                 "Jim", 100)
    deplacement = vaisseau.deplacement(8, 12, 7)
    
    print("hypo:" + str(vaisseau.gethypo(8, 12, 7)))
    
#    print("angle:" + str(vaisseau.getangle(14,20)))
    
    print(deplacement[4])
    
    print(deplacement[5])
    
    print(deplacement[6])
    
    
  
    
    
#    print(vaisseau.deplacement(10,10,0)[4])
#    
#    print(vaisseau.deplacement(10,10,0)[5])
    
    
    #collision = Unite(Entite,5,10,"allo","vaisseau",30,10,10,0,10,20,0,"voi","francois",10,20)

    #print collision.newlocal
    
    
#--------------------------------------------------------------------------------------#    
class Vehicule(Unite):
    def __init__(self, nom, dimX, dimY, dimZ, posX, posY, posZ, joueur, vies_max, degat, portee, vitesse, vitesse_attaque, id):         
        Unite.__init__(self, nom, dimX, dimY, dimZ, posX, posY, posZ, joueur, vies_max, degat, portee, vitesse, vitesse_attaque, id)
       
           
    #methode pr modifier la vitesse des vehicules
    def modifierVitesse(self, nouvelleVitesse):
        self.vitesse = nouvelleVitesse
        print (self.vitesse)
        
    def modifierNom(self, nouveauNom):
        self.nom = nouveauNom
        print (self.nom)
 
       
#--------------------------------------------------------------------------------------#        
        
class Tank(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):     
        #Vehicule.__init__(self, nom, nbrVies, dimX, dimY, dimZ, posX, posY, posZ, joueur, cout_ressource, vies_max, degat, portee, vitesse, vitesse_attaque, id) 
        Vehicule.__init__(self, "MegaTank", 40, 40, 40, posX, posY, posZ, joueur,100, 30, 120, 3, 30, id)      
          
#--------------------------------------------------------------------------------------#
class Vaisseau(Vehicule): 
    def __init__(self,  posX, posY, posZ, joueur,  id):  
        Vehicule.__init__(self, "Vaisseau", 40, 40, 40, posX, posY, posZ, joueur,100, 20, 120, 10, 20, id) 
#--------------------------------------------------------------------------------------#

class Explorateur(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):   
        Vehicule.__init__(self, "Explorator", 30, 30, 30, posX, posY, posZ, joueur,100, 10, 120, 15, 30, id)
        self.image=PhotoImage(file="images/vaisseaux/Explorateur.GIF")

#--------------------------------------------------------------------------------------#
class Transporteur(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):   
        Vehicule.__init__(self, "FedExOrion", 60, 60, 60, posX, posY, posZ, joueur,100, 15, 120, 8, 30, id)
        self.image=PhotoImage(file="images/vaisseaux/Transporteur.GIF")
#--------------------------------------------------------------------------------------#
class Fregate(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):   
        Vehicule.__init__(self, "FregateX", 50, 50, 50, posX, posY, posZ, joueur,100, 20, 120, 10, 20, id)
        self.image=PhotoImage(file="images/vaisseaux/Fregate.GIF")
#--------------------------------------------------------------------------------------#
class Colonisateur(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):   
        Vehicule.__init__(self, "ColonOrion", 60, 60, 60, posX, posY, posZ, joueur,100, 15, 120, 7, 30, id)
        self.image=PhotoImage(file="images/vaisseaux/Colonisateur.GIF")
#--------------------------------------------------------------------------------------#
class Croiseur(Vehicule):
    def __init__(self,  posX, posY, posZ, joueur,  id):   
        Vehicule.__init__(self, "LeCroiseur", 70, 70, 70, posX, posY, posZ, joueur,100, 30, 120, 9, 20, id)
        self.image=PhotoImage(file="images/vaisseaux/Croiseur.GIF")
#--------------------------------------------------------------------------------------#
